package com.sunyard.utils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import java.math.BigDecimal;

/**
 * @author ：xiaog.li
 * @date ： 2019/5/30 15:03
 * @description：银联标识
 * @version: 1.0$
 */
@Slf4j
public class TusnUtil {
    /**
     * 获取银联唯一标识
     *
     * @author xiaog.li
     * @date 2019/6/1 16:08
     */
    public static String getTusn(String deviceSn, String random, String cipher,
                                 String appVersion, String lng, String lat, String netCertNo) {
        String deviceType = deviceSn.substring(6, 8);
        log.info("终端类型：" + deviceType);
        String tusn = "01" + getLen3(deviceType.length()) + deviceType +
                "02" + getLen3(deviceSn.length()) + deviceSn +
                "03" + getLen3(random.length()) + random +
                "04" + getLen3(cipher.length()) + cipher +
                "05" + getLen3(getAppVersion(appVersion).length()) + getAppVersion(appVersion) +
                "06" + getLen3(getLng(lng).length()) + getLng(lng) +
                "07" + getLen3(getLat(lat).length()) + getLat(lat) +
                "08" + getLen3(netCertNo.length()) + netCertNo;
        tusn = "A2".concat(getLen3(tusn.length())).concat(tusn);
        return tusn;
    }


    private static String getLen3(int num) {
        return String.format("%03d", num);
    }


    private static String getAppVersion(String appVersion) {
        if (StringUtils.isEmpty(appVersion) || appVersion.length() > 8) {
            throw new IllegalArgumentException("应用版本号不正确");
        }
        while (appVersion.length() < 8) {
            appVersion = appVersion.concat(" ");
        }
        return appVersion;
    }

    private static String getLng(String lng) {
        if (StringUtils.isEmpty(lng)) {
            throw new NullPointerException("经度不能为空");
        }
        //返回十位长度经度
        lng = new BigDecimal(lng).setScale(6, BigDecimal.ROUND_HALF_UP).toString();
        double longitude = Double.parseDouble(lng);
        if (longitude <= 0) {
            throw new IllegalArgumentException("经度参数错误");
        }
        if (longitude > 0 && longitude < 10) {
            //前面加00
            lng = "00".concat(lng);
        } else if (longitude >= 10 && longitude < 100) {
            //前面加0
            lng = "0".concat(lng);
        }
        return lng;

    }

    private static String getLat(String lat) {
        if (StringUtils.isEmpty(lat)) {
            throw new NullPointerException("纬度不能为空");
        }
        //保留6位小数  四舍五入
        lat = new BigDecimal(lat).setScale(6, BigDecimal.ROUND_HALF_UP).toString();
        double latitude = Double.parseDouble(lat);
        if (latitude < -100 || latitude > 100 || latitude == 0) {
            throw new IllegalArgumentException("纬度数据错误");
        }
        if (latitude > -10 && latitude < 0) {
            //负号后面加一位0
            lat = lat.replaceAll("-", "-0");
        } else if (latitude > 0 && latitude < 10) {
            //前面加"+0"
            lat = "+0".concat(lat);
        } else if (latitude >= 10) {
            //前面加"+"
            lat = "+".concat(lat);
        }
        return lat;
    }

}
